//! cpuindex
//!
//! 提供了标识, 遍历 cpu 的接口
//!
//! 一般该功能在 linux 中属于是 percpu 和 cpumask, percpu 将当前 cpu
//! 内存域与 percpu 段的偏移保存在当前 cpu 的 id 寄存器中, 用于快速获取本地数据.
//! cpumask 提供了遍历系统中所有 cpu 的接口, 包括遍历 prossible, online cpu.
#![no_std]

use cpuindex_macro::ffi_nr_cpus;

cfg_if::cfg_if! {
    if #[cfg(target_arch = "aarch64")] {
        mod aarch64;
        use crate::aarch64::*;
    } else {
        mod noop;
        use crate::noop::*;
    }
}

/// 获取当前 cpu 自定义 id
#[inline(always)]
pub fn this_processor_id() -> usize {
    arch_my_processor_id()
}

/// 设置当前 cpu 自定义 id
#[inline(always)]
pub fn set_this_processor_id(id: usize) {
    arch_set_my_processor_id(id);
}

static mut NR_CPUS: usize = 0;

#[ffi_nr_cpus]
fn set_nr_cpus(nr: usize) {
    unsafe {
        NR_CPUS = nr;
    }
}

/// 获取系统中 cpu 的最大个数
///
/// 在运行时库中定义了系统能支持的最大 cpu 数量, 但在这里不是该 cpu 数量,
/// 而是在正确获取了 cpu 实际数量后填充 NR_CPUS, 并通过 nr_cpus() 获取实际 cpu 数量.
#[inline(always)]
pub fn nr_cpus() -> usize {
    unsafe { NR_CPUS }
}
